<?php
namespace app\index\model;
use think\Model;
use think\Db;
use nav\PHPTree;

class Page extends Model
{
  //===========
  //1.下拉菜单 
  //2.导航菜单 
  //===========
  
  /**
   * [1-1 获取带缩进格式的下拉菜单分类数组(二维)]
   * @param  int $pid 父级菜单的ID编号
   * @param  int $space_num 菜单缩进的空格数
   * @todo   通过ListOrder字段为菜单增加排序
   * @return array 返回带缩进格式的二维数组
   */
  private function getList($pid=0,$space_num=0)
  { 
    $res = array();   //返回结果集
    $space_num += 4;  //每次迭代,缩进空格数量增2
    
    //根据父级ID查询子栏目
    $result = \think\Db::name('page')->where('parent_id','eq',$pid)->where('status','eq',1)->select();

    //为空时候返回错误
    if(!$result) return false;
    
    //遍历子栏目
    foreach($result as $value){

      //增加装饰及缩进
      $value["title"] = str_repeat("&nbsp;",$space_num) . "|--" . $value["title"];
      
      //添加记录到结果集
      $res[]= $value;

      //并根据记录ID继续向下查询子栏目
      $tmp = $this->getList($value["id"],$value['id'],$space_num);
      
      //如果存在子栏目,则合并子栏目的记录到结果集
      if($tmp){
        $res = array_merge($res,$tmp);
      }
    }
    //返回迭代生成的递归菜单
    return $res;

  }
  /**
   * [1-2 输出显示二维导航下拉菜单内容]
   * @param  int $pid     父栏目ID
   * @param  int $select  当前选中的下拉菜f单栏目ID
   * @param  boolean $isNewAdd 是否新增栏目用途
   * @todo   菜单样式硬编码改为菜单样式类
   * @return string  HTML格式的下拉菜单代码
   */
  public function displayPage($pid=0,$select=0,$isNewAdd=false){
    
    //获取带缩进格式下拉菜单数组
    $res = $this->getList($pid);

    //没有内容时返回一级页面菜单
    if(false==$res){
      
      //文章选择分类用途,新增"待分类"选项      
      $str ="<select name='parent_id' style='width:200px;height:20px;'>";
      $str .= "<option value=0 >-----暂无页面------</option>";
      $str .=("</select>");
      return $str;
    };

    //判断是否新增栏目用途
    if($isNewAdd){

      //新增用途,添加顶级栏目选项
      $str ="<select name='parent_id' style='width:200px;height:20px;'>";
      $str .= "<option value=0 >-----一级页面------</option>";

    }else{

      //文章选择分类用途,新增"待分类"选项      
      $str ="<select name='parent_id' style='width:200px;height:20px;'>";

      //添加当前选中菜单的代码
      if(0==$select){
        $selected = "selected";
      }else{
        $selected = "";
      } 
      $str .= "<option value=0 {$selected}>-----请选择-----</option>";

    }
    //根据菜单数组循环添加菜单HTML代码
    foreach($res as $key=>$value){

      //添加当前选中菜单的代码
      if($value['id']==$select){
        $selected = "selected";
      }else{
        $selected = "";
      } 
      $str .= "<option value={$value['id']} {$selected}>{$value['title']}</option>";
    }
    $str .=("</select>");

    //返回生成的HTML格式下拉菜单代码
    return $str;
  }
  /**
   * [1-3 获取子级别菜单记录ID(二维)]
   * @param  int $pid 父级菜单的ID编号
   * @return array 返回子页面的ID数组
   */
  public function getSubID($pid=0)
  { 
    $res = array();   //返回结果集
    //$space_num += 4;  //每次迭代,缩进空格数量增2
    
    //根据父级ID查询子栏目
    $result = \think\Db::name('page')->where('parent_id','eq',$pid)->select();

    //为空时候返回空数组
    if(!$result) return array();
    
    //遍历子页面
    foreach($result as $value){
      
      //添加记录到结果集
      $res[]= $value['id'];

      //并根据记录ID继续向下查询子栏目
      $tmp = $this->getSubID($value["id"]);
      
      //如果存在子栏目,则合并子栏目的记录到结果集
      if($tmp){
        $res = array_merge($res,$tmp);
      }
    }
    //返回迭代生成的递归菜单
    return $res;
  }

  /**
   * [2.获取生成导航标签所需的分类数组]
   * @todo  可将字段的排序以及匹配或排除条件作为菜单生成的参数
   * @return array   导航菜单数组
   */
  public function getNav()
  {
    //定义返回的结果集
    $result = array();   
    
    /**
     * [分类全表查询(排除待分类),可选择导航菜单匹配条件及排序方法]
     */
    $result = \think\Db::name('page')->where('status','eq',1)->select();

    /**
     * [调用PHPTree静态方法生成导航菜单数组]
     * @param array  $result 待生成的二维菜单数组
     * @param string primary_key 主键
     * @param string parent_key  父级栏目ID字段名
     */
    $r = PHPTree::makeTree($result, array(
      'primary_key' => 'id',
      'parent_key'  => 'parent_id'
    ));

    //返回导航菜单数组
    return $r;
  }
  /**
   * [3.获取生成导航标签所需的分类数组]
   * @todo  可将字段的排序以及匹配或排除条件作为菜单生成的参数
   * @return array   导航菜单数组
   */
  static function getTreeViewNav(){
    
    //定义返回的结果集
    $r = array();   
    
    $res = Db::name('page')->where('status','eq',1)->select();
    
    //按照bootstrap-treeview插件要求改键名
    foreach($res as $key=>$value){
      
      //字段数组遍历
      foreach($value as $k=>$v){
        if("title"==$k){
          $r[$key]["text"]=$res[$key][$k];
        }else{
          $r[$key][$k]=$res[$key][$k];
        }
      }
    }
    //按照bootstrap-treeview插件要求改键名
    $r = PHPTree::makeTree($r, array(
      'primary_key' => 'id',
      'parent_key'  => 'parent_id',
      'expanded'    => true,
      'children_key'=> 'nodes',
    ));

    //返回bootstrap-treeview导航菜单数组
    return $r;
  }
}